home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / tex / files / !tex / TeXsource / web2ctex / ctex / c / tex6 < prev    next >
Encoding:
Text File  |  1988-05-19  |  50.9 KB  |  2,035 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4. zpostlinebreak ( finalwidowpenalty ) 
  5. integer finalwidowpenalty ; 
  6. {/* 30 31 */ postlinebreak_regmem 
  7.   halfword q, r, s  ; 
  8.   boolean discbreak  ; 
  9.   scaled curwidth  ; 
  10.   scaled curindent  ; 
  11.   quarterword t  ; 
  12.   integer pen  ; 
  13.   halfword curline  ; 
  14.   q = mem [ bestbet + 1 ] .hh .v.RH ; 
  15.   curp = 0 ; 
  16.   do {
  17.       r = q ; 
  18.     q = mem [ q + 1 ] .hh .v.LH ; 
  19.     mem [ r + 1 ] .hh .v.LH = curp ; 
  20.     curp = r ; 
  21.   } while ( ! ( q == 0 ) ) ; 
  22.   curline = curlist .pgfield + 1 ; 
  23.   do {
  24.       q = mem [ curp + 1 ] .hh .v.RH ; 
  25.     discbreak = false ; 
  26.     if ( q != 0 ) 
  27.     if ( mem [ q ] .hh.b0 == 10 ) 
  28.     {
  29.       deleteglueref ( mem [ q + 1 ] .hh .v.LH ) ; 
  30.       mem [ q + 1 ] .hh .v.LH = eqtb [ 3534 ] .hh .v.RH ; 
  31.       mem [ q ] .hh.b1 = 9 ; 
  32.       incr ( mem [ eqtb [ 3534 ] .hh .v.RH ] .hh .v.RH ) ; 
  33.       goto lab30 ; 
  34.     } 
  35.     else {
  36.     
  37.       if ( mem [ q ] .hh.b0 == 7 ) 
  38.       {
  39.     t = mem [ q ] .hh.b1 ; 
  40.     if ( t == 0 ) 
  41.     r = mem [ q ] .hh .v.RH ; 
  42.     else {
  43.         
  44.       r = q ; 
  45.       while ( t > 1 ) {
  46.           
  47.         r = mem [ r ] .hh .v.RH ; 
  48.         decr ( t ) ; 
  49.       } 
  50.       s = mem [ r ] .hh .v.RH ; 
  51.       if ( ! ( s >= himemmin ) ) 
  52.       if ( mem [ curp + 1 ] .hh .v.LH != 0 ) 
  53.       if ( mem [ mem [ curp + 1 ] .hh .v.LH + 1 ] .hh .v.RH == s ) 
  54.       s = r ; 
  55.       r = mem [ s ] .hh .v.RH ; 
  56.       mem [ s ] .hh .v.RH = 0 ; 
  57.       flushnodelist ( mem [ q ] .hh .v.RH ) ; 
  58.       mem [ q ] .hh.b1 = 0 ; 
  59.     } 
  60.     if ( mem [ q + 1 ] .hh .v.RH != 0 ) 
  61.     {
  62.       s = mem [ q + 1 ] .hh .v.RH ; 
  63.       while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; 
  64.       mem [ s ] .hh .v.RH = r ; 
  65.       r = mem [ q + 1 ] .hh .v.RH ; 
  66.       mem [ q + 1 ] .hh .v.RH = 0 ; 
  67.     } 
  68.     if ( mem [ q + 1 ] .hh .v.LH != 0 ) 
  69.     {
  70.       s = mem [ q + 1 ] .hh .v.LH ; 
  71.       mem [ q ] .hh .v.RH = s ; 
  72.       while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; 
  73.       mem [ q + 1 ] .hh .v.LH = 0 ; 
  74.       q = s ; 
  75.     } 
  76.     mem [ q ] .hh .v.RH = r ; 
  77.     discbreak = true ; 
  78.       } 
  79.       else if ( ( mem [ q ] .hh.b0 == 9 ) || ( mem [ q ] .hh.b0 == 11 ) ) 
  80.       mem [ q + 1 ] .cint = 0 ; 
  81.     } 
  82.     else {
  83.     
  84.       q = memtop - 3 ; 
  85.       while ( mem [ q ] .hh .v.RH != 0 ) q = mem [ q ] .hh .v.RH ; 
  86.     } 
  87.     r = newparamglue ( 8 ) ; 
  88.     mem [ r ] .hh .v.RH = mem [ q ] .hh .v.RH ; 
  89.     mem [ q ] .hh .v.RH = r ; 
  90.     q = r ; 
  91.     lab30: ; 
  92.     r = mem [ q ] .hh .v.RH ; 
  93.     mem [ q ] .hh .v.RH = 0 ; 
  94.     q = mem [ memtop - 3 ] .hh .v.RH ; 
  95.     mem [ memtop - 3 ] .hh .v.RH = r ; 
  96.     if ( eqtb [ 3533 ] .hh .v.RH != 0 ) 
  97.     {
  98.       r = newparamglue ( 7 ) ; 
  99.       mem [ r ] .hh .v.RH = q ; 
  100.       q = r ; 
  101.     } 
  102.     if ( curline > lastspecialline ) 
  103.     {
  104.       curwidth = secondwidth ; 
  105.       curindent = secondindent ; 
  106.     } 
  107.     else if ( eqtb [ 4056 ] .hh .v.RH == 0 ) 
  108.     {
  109.       curwidth = firstwidth ; 
  110.       curindent = firstindent ; 
  111.     } 
  112.     else {
  113.     
  114.       curwidth = mem [ eqtb [ 4056 ] .hh .v.RH + 2 * curline ] .cint ; 
  115.       curindent = mem [ eqtb [ 4056 ] .hh .v.RH + 2 * curline - 1 ] .cint ; 
  116.     } 
  117.     adjusttail = memtop - 5 ; 
  118.     justbox = hpack ( q , curwidth , 0 ) ; 
  119.     mem [ justbox + 4 ] .cint = curindent ; 
  120.     appendtovlist ( justbox ) ; 
  121.     if ( memtop - 5 != adjusttail ) 
  122.     {
  123.       mem [ curlist .tailfield ] .hh .v.RH = mem [ memtop - 5 ] .hh .v.RH ; 
  124.       curlist .tailfield = adjusttail ; 
  125.     } 
  126.     adjusttail = 0 ; 
  127.     if ( curline + 1 != bestline ) 
  128.     {
  129.       pen = eqtb [ 5280 ] .cint ; 
  130.       if ( curline == curlist .pgfield + 1 ) 
  131.       pen = pen + eqtb [ 5272 ] .cint ; 
  132.       if ( curline + 2 == bestline ) 
  133.       pen = pen + finalwidowpenalty ; 
  134.       if ( discbreak ) 
  135.       pen = pen + eqtb [ 5275 ] .cint ; 
  136.       if ( pen != 0 ) 
  137.       {
  138.     r = newpenalty ( pen ) ; 
  139.     mem [ curlist .tailfield ] .hh .v.RH = r ; 
  140.     curlist .tailfield = r ; 
  141.       } 
  142.     } 
  143.     incr ( curline ) ; 
  144.     curp = mem [ curp + 1 ] .hh .v.LH ; 
  145.     if ( curp != 0 ) 
  146.     {
  147.       r = memtop - 3 ; 
  148.       while ( true ) {
  149.       
  150.     q = mem [ r ] .hh .v.RH ; 
  151.     if ( q == mem [ curp + 1 ] .hh .v.RH ) 
  152.     goto lab31 ; 
  153.     if ( ( q >= himemmin ) ) 
  154.     goto lab31 ; 
  155.     if ( ( mem [ q ] .hh.b0 < 9 ) ) 
  156.     goto lab31 ; 
  157.     if ( mem [ q ] .hh.b1 == 2 ) 
  158.     if ( mem [ q ] .hh.b0 == 11 ) 
  159.     goto lab31 ; 
  160.     r = q ; 
  161.       } 
  162.       lab31: if ( r != memtop - 3 ) 
  163.       {
  164.     mem [ r ] .hh .v.RH = 0 ; 
  165.     flushnodelist ( mem [ memtop - 3 ] .hh .v.RH ) ; 
  166.     mem [ memtop - 3 ] .hh .v.RH = q ; 
  167.       } 
  168.     } 
  169.   } while ( ! ( curp == 0 ) ) ; 
  170.   if ( ( curline != bestline ) || ( mem [ memtop - 3 ] .hh .v.RH != 0 ) ) 
  171.   confusion ( 791 ) ; 
  172.   curlist .pgfield = bestline - 1 ; 
  173. smallnumber zreconstitute ( j , n ) 
  174. smallnumber j , n ; 
  175. {/* 22 30 */ register smallnumber Result; reconstitute_regmem 
  176.   halfword p  ; 
  177.   halfword s  ; 
  178.   fourquarters q  ; 
  179.   quarterword c  ; 
  180.   quarterword d  ; 
  181.   scaled w  ; 
  182.   integer r  ; 
  183.   hyphenpassed = 0 ; 
  184.   s = memtop - 4 ; 
  185.   w = 0 ; 
  186.   d = hu [ j ] ; 
  187.   c = d ; 
  188.   while ( true ) {
  189.       
  190.     lab22: p = getavail () ; 
  191.     mem [ p ] .hh.b0 = hf ; 
  192.     mem [ p ] .hh.b1 = c ; 
  193.     mem [ s ] .hh .v.RH = p ; 
  194.     if ( j == n ) 
  195.     goto lab30 ; 
  196.     q = fontinfo [ charbase [ hf ] + d ] .qqqq ; 
  197.     if ( ( ( q .b2 ) % 4 ) != 1 ) 
  198.     goto lab30 ; 
  199.     r = ligkernbase [ hf ] + q .b3 ; 
  200.     c = hu [ j + 1 ] ; 
  201.     while ( true ) {
  202.     
  203.       q = fontinfo [ r ] .qqqq ; 
  204.       if ( q .b1 == c ) 
  205.       {
  206.     if ( odd ( hyf [ j ] ) && ( hyphenpassed == 0 ) ) 
  207.     hyphenpassed = j ; 
  208.     if ( q .b2 < 128 ) 
  209.     {
  210.       d = q .b3 ; 
  211.       incr ( j ) ; 
  212.       s = p ; 
  213.       goto lab22 ; 
  214.     } 
  215.     else {
  216.         
  217.       w = fontinfo [ kernbase [ hf ] + q .b3 ] .cint ; 
  218.       goto lab30 ; 
  219.     } 
  220.       } 
  221.       else if ( q .b0 < 128 ) 
  222.       incr ( r ) ; 
  223.       else goto lab30 ; 
  224.     } 
  225.   } 
  226.   lab30: ; 
  227.   if ( s != memtop - 4 ) 
  228.   {
  229.     p = newligature ( hf , d , mem [ memtop - 4 ] .hh .v.RH ) ; 
  230.     mem [ memtop - 4 ] .hh .v.RH = p ; 
  231.   } 
  232.   if ( w != 0 ) 
  233.   mem [ mem [ memtop - 4 ] .hh .v.RH ] .hh .v.RH = newkern ( w ) ; 
  234.   Result = j ; 
  235.   return(Result) ; 
  236. hyphenate () {
  237.     /* 30 40 45 41 10 */ hyphenate_regmem 
  238.   schar i, j, l  ; 
  239.   halfword q, r, s  ; 
  240.   halfword majortail, minortail  ; 
  241.   ASCIIcode c  ; 
  242.   halfword hyfnode  ; 
  243.   triepointer z  ; 
  244.   quarterword v  ; 
  245.   hyphpointer h  ; 
  246.   strnumber k  ; 
  247.   poolpointer u  ; 
  248.   {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do 
  249.     hyf [ j ] = 0 ; 
  250.   while ( j++ < for_end ) ; } 
  251.   h = hc [ 1 ] ; 
  252.   {register integer for_end; j = 2 ; for_end = hn ; if ( j <= for_end) do 
  253.     h = ( h + h + hc [ j ] ) % 307 ; 
  254.   while ( j++ < for_end ) ; } 
  255.   while ( true ) {
  256.       
  257.     k = hyphword [ h ] ; 
  258.     if ( k == 0 ) 
  259.     goto lab45 ; 
  260.     if ( ( strstart [ k + 1 ] - strstart [ k ] ) < hn ) 
  261.     goto lab45 ; 
  262.     if ( ( strstart [ k + 1 ] - strstart [ k ] ) == hn ) 
  263.     {
  264.       j = 1 ; 
  265.       u = strstart [ k ] ; 
  266.       do {
  267.       if ( strpool [ u ] < hc [ j ] ) 
  268.     goto lab45 ; 
  269.     if ( strpool [ u ] > hc [ j ] ) 
  270.     goto lab30 ; 
  271.     incr ( j ) ; 
  272.     incr ( u ) ; 
  273.       } while ( ! ( j > hn ) ) ; 
  274.       s = hyphlist [ h ] ; 
  275.       while ( s != 0 ) {
  276.       
  277.     hyf [ mem [ s ] .hh .v.LH ] = 1 ; 
  278.     s = mem [ s ] .hh .v.RH ; 
  279.       } 
  280.       goto lab40 ; 
  281.     } 
  282.     lab30: ; 
  283.     if ( h > 0 ) 
  284.     decr ( h ) ; 
  285.     else h = 307 ; 
  286.   } 
  287.   lab45: ; 
  288.   hc [ 0 ] = 127 ; 
  289.   hc [ hn + 1 ] = 127 ; 
  290.   hc [ hn + 2 ] = 256 ; 
  291.   {register integer for_end; j = 0 ; for_end = hn - 2 ; if ( j <= for_end) do 
  292.     {
  293.       z = hc [ j ] ; 
  294.       l = j ; 
  295.       while ( hc [ l ] == trie [ z ] .b1 ) {
  296.       
  297.     if ( trie [ z ] .b0 != 0 ) 
  298.     {
  299.       v = trie [ z ] .b0 ; 
  300.       do {
  301.           i = l - hyfdistance [ v ] ; 
  302.         if ( hyfnum [ v ] > hyf [ i ] ) 
  303.         hyf [ i ] = hyfnum [ v ] ; 
  304.         v = hyfnext [ v ] ; 
  305.       } while ( ! ( v == 0 ) ) ; 
  306.     } 
  307.     incr ( l ) ; 
  308.     z = trie [ z ] .v.RH + hc [ l ] ; 
  309.       } 
  310.     } 
  311.   while ( j++ < for_end ) ; } 
  312.   lab40: hyf [ 1 ] = 0 ; 
  313.   hyf [ hn - 2 ] = 0 ; 
  314.   hyf [ hn - 1 ] = 0 ; 
  315.   hyf [ hn ] = 0 ; 
  316.   {register integer for_end; j = 2 ; for_end = hn - 3 ; if ( j <= for_end) do 
  317.     if ( odd ( hyf [ j ] ) ) 
  318.     goto lab41 ; 
  319.   while ( j++ < for_end ) ; } 
  320.   return ; 
  321.   lab41: ; 
  322.   q = mem [ hb ] .hh .v.RH ; 
  323.   mem [ hb ] .hh .v.RH = 0 ; 
  324.   s = curp ; 
  325.   while ( mem [ s ] .hh .v.RH != ha ) s = mem [ s ] .hh .v.RH ; 
  326.   mem [ s ] .hh .v.RH = 0 ; 
  327.   flushnodelist ( ha ) ; 
  328.   j = 0 ; 
  329.   do {
  330.       l = j ; 
  331.     j = reconstitute ( j + 1 , hn ) ; 
  332.     if ( hyphenpassed != 0 ) 
  333.     {
  334.       r = getnode ( 2 ) ; 
  335.       mem [ s ] .hh .v.RH = r ; 
  336.       mem [ r ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  337.       mem [ r ] .hh.b0 = 7 ; 
  338.       majortail = mem [ memtop - 4 ] .hh .v.RH ; 
  339.       if ( mem [ majortail ] .hh .v.RH != 0 ) 
  340.       majortail = mem [ majortail ] .hh .v.RH ; 
  341.       i = hyphenpassed ; 
  342.       minortail = 0 ; 
  343.       hyfnode = newcharacter ( hf , hyfchar ) ; 
  344.       if ( hyfnode != 0 ) 
  345.       {
  346.     incr ( i ) ; 
  347.     c = hu [ i ] ; 
  348.     hu [ i ] = hyfchar ; 
  349.       } 
  350.       do {
  351.       l = reconstitute ( l + 1 , i ) ; 
  352.     if ( minortail == 0 ) 
  353.     mem [ r + 1 ] .hh .v.LH = mem [ memtop - 4 ] .hh .v.RH ; 
  354.     else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  355.     minortail = mem [ memtop - 4 ] .hh .v.RH ; 
  356.     if ( mem [ minortail ] .hh .v.RH != 0 ) 
  357.     minortail = mem [ minortail ] .hh .v.RH ; 
  358.       } while ( ! ( l == i ) ) ; 
  359.       if ( hyfnode != 0 ) 
  360.       {
  361.     hu [ i ] = c ; 
  362.     {
  363.       mem [ hyfnode ] .hh .v.RH = avail ; 
  364.       avail = hyfnode ; 
  365.     ;
  366. #ifdef STAT
  367.       decr ( dynused ) ; 
  368. #endif /* STAT */
  369.     } 
  370.     decr ( i ) ; 
  371.     l = i ; 
  372.       } 
  373.       hyf [ i ] = 0 ; 
  374.       minortail = 0 ; 
  375.       mem [ r + 1 ] .hh .v.RH = 0 ; 
  376.       while ( l < j ) {
  377.       
  378.     do {
  379.         l = reconstitute ( l + 1 , hn ) ; 
  380.       if ( minortail == 0 ) 
  381.       mem [ r + 1 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  382.       else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  383.       minortail = mem [ memtop - 4 ] .hh .v.RH ; 
  384.       if ( mem [ minortail ] .hh .v.RH != 0 ) 
  385.       {
  386.         hyf [ l ] = 0 ; 
  387.         minortail = mem [ minortail ] .hh .v.RH ; 
  388.       } 
  389.     } while ( ! ( l >= j ) ) ; 
  390.     while ( l > j ) {
  391.         
  392.       j = reconstitute ( j + 1 , hn ) ; 
  393.       mem [ majortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  394.       majortail = mem [ memtop - 4 ] .hh .v.RH ; 
  395.       if ( mem [ majortail ] .hh .v.RH != 0 ) 
  396.       {
  397.         hyf [ j ] = 0 ; 
  398.         majortail = mem [ majortail ] .hh .v.RH ; 
  399.       } 
  400.     } 
  401.       } 
  402.       i = 0 ; 
  403.       s = r ; 
  404.       while ( mem [ s ] .hh .v.RH != 0 ) {
  405.       
  406.     incr ( i ) ; 
  407.     s = mem [ s ] .hh .v.RH ; 
  408.       } 
  409.       mem [ r ] .hh.b1 = i ; 
  410.     } 
  411.     else {
  412.     
  413.       mem [ s ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  414.       s = mem [ s ] .hh .v.RH ; 
  415.       if ( mem [ s ] .hh .v.RH != 0 ) 
  416.       s = mem [ s ] .hh .v.RH ; 
  417.     } 
  418.     if ( odd ( hyf [ j ] ) ) 
  419.     {
  420.       r = newdisc () ; 
  421.       mem [ r + 1 ] .hh .v.LH = newcharacter ( hf , hyfchar ) ; 
  422.       mem [ s ] .hh .v.RH = r ; 
  423.       s = r ; 
  424.     } 
  425.   } while ( ! ( j == hn ) ) ; 
  426.   mem [ s ] .hh .v.RH = q ; 
  427. zlinebreak ( finalwidowpenalty ) 
  428. integer finalwidowpenalty ; 
  429. {/* 30 31 32 33 34 */ linebreak_regmem 
  430.   boolean autobreaking  ; 
  431.   halfword prevp  ; 
  432.   halfword q, r, s  ; 
  433.   internalfontnumber f  ; 
  434.   smallnumber j  ; 
  435.   unsigned char c  ; 
  436.   packbeginline = curlist .mlfield ; 
  437.   mem [ memtop - 3 ] .hh .v.RH = mem [ curlist .headfield ] .hh .v.RH ; 
  438.   if ( ( curlist .tailfield >= himemmin ) ) 
  439.   {
  440.     mem [ curlist .tailfield ] .hh .v.RH = newpenalty ( 10000 ) ; 
  441.     curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  442.   } 
  443.   else if ( mem [ curlist .tailfield ] .hh.b0 != 10 ) 
  444.   {
  445.     mem [ curlist .tailfield ] .hh .v.RH = newpenalty ( 10000 ) ; 
  446.     curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  447.   } 
  448.   else {
  449.       
  450.     mem [ curlist .tailfield ] .hh.b0 = 12 ; 
  451.     deleteglueref ( mem [ curlist .tailfield + 1 ] .hh .v.LH ) ; 
  452.     flushnodelist ( mem [ curlist .tailfield + 1 ] .hh .v.RH ) ; 
  453.     mem [ curlist .tailfield + 1 ] .cint = 10000 ; 
  454.   } 
  455.   mem [ curlist .tailfield ] .hh .v.RH = newparamglue ( 14 ) ; 
  456.   popnest () ; 
  457.   noshrinkerroryet = true ; 
  458.   if ( ( mem [ eqtb [ 3533 ] .hh .v.RH ] .hh.b1 != 0 ) && ( mem [ eqtb [ 3533 
  459.   ] .hh .v.RH + 3 ] .cint != 0 ) ) 
  460.   {
  461.     eqtb [ 3533 ] .hh .v.RH = finiteshrink ( eqtb [ 3533 ] .hh .v.RH ) ; 
  462.   } 
  463.   if ( ( mem [ eqtb [ 3534 ] .hh .v.RH ] .hh.b1 != 0 ) && ( mem [ eqtb [ 3534 
  464.   ] .hh .v.RH + 3 ] .cint != 0 ) ) 
  465.   {
  466.     eqtb [ 3534 ] .hh .v.RH = finiteshrink ( eqtb [ 3534 ] .hh .v.RH ) ; 
  467.   } 
  468.   q = eqtb [ 3533 ] .hh .v.RH ; 
  469.   r = eqtb [ 3534 ] .hh .v.RH ; 
  470.   background [ 1 ] = mem [ q + 1 ] .cint + mem [ r + 1 ] .cint ; 
  471.   background [ 2 ] = 0 ; 
  472.   background [ 3 ] = 0 ; 
  473.   background [ 4 ] = 0 ; 
  474.   background [ 5 ] = 0 ; 
  475.   background [ 2 + mem [ q ] .hh.b0 ] = mem [ q + 2 ] .cint ; 
  476.   background [ 2 + mem [ r ] .hh.b0 ] = background [ 2 + mem [ r ] .hh.b0 ] + 
  477.   mem [ r + 2 ] .cint ; 
  478.   background [ 6 ] = mem [ q + 3 ] .cint + mem [ r + 3 ] .cint ; 
  479.   minimumdemerits = 1073741823L ; 
  480.   minimaldemerits [ 3 ] = 1073741823L ; 
  481.   minimaldemerits [ 2 ] = 1073741823L ; 
  482.   minimaldemerits [ 1 ] = 1073741823L ; 
  483.   minimaldemerits [ 0 ] = 1073741823L ; 
  484.   if ( eqtb [ 4056 ] .hh .v.RH == 0 ) 
  485.   if ( eqtb [ 5718 ] .cint == 0 ) 
  486.   {
  487.     lastspecialline = 0 ; 
  488.     secondwidth = eqtb [ 5704 ] .cint ; 
  489.     secondindent = 0 ; 
  490.   } 
  491.   else {
  492.       
  493.     lastspecialline = abs ( eqtb [ 5308 ] .cint ) ; 
  494.     if ( eqtb [ 5308 ] .cint < 0 ) 
  495.     {
  496.       firstwidth = eqtb [ 5704 ] .cint - abs ( eqtb [ 5718 ] .cint ) ; 
  497.       if ( eqtb [ 5718 ] .cint >= 0 ) 
  498.       firstindent = eqtb [ 5718 ] .cint ; 
  499.       else firstindent = 0 ; 
  500.       secondwidth = eqtb [ 5704 ] .cint ; 
  501.       secondindent = 0 ; 
  502.     } 
  503.     else {
  504.     
  505.       firstwidth = eqtb [ 5704 ] .cint ; 
  506.       firstindent = 0 ; 
  507.       secondwidth = eqtb [ 5704 ] .cint - abs ( eqtb [ 5718 ] .cint ) ; 
  508.       if ( eqtb [ 5718 ] .cint >= 0 ) 
  509.       secondindent = eqtb [ 5718 ] .cint ; 
  510.       else secondindent = 0 ; 
  511.     } 
  512.   } 
  513.   else {
  514.       
  515.     lastspecialline = mem [ eqtb [ 4056 ] .hh .v.RH ] .hh .v.LH - 1 ; 
  516.     secondwidth = mem [ eqtb [ 4056 ] .hh .v.RH + 2 * ( lastspecialline + 1 ) 
  517.     ] .cint ; 
  518.     secondindent = mem [ eqtb [ 4056 ] .hh .v.RH + 2 * lastspecialline + 1 ] 
  519.     .cint ; 
  520.   } 
  521.   if ( eqtb [ 5286 ] .cint == 0 ) 
  522.   easyline = lastspecialline ; 
  523.   else easyline = 65535L ; 
  524.   threshold = eqtb [ 5267 ] .cint ; 
  525.   if ( threshold >= 0 ) 
  526.   {
  527.     ;
  528. #ifdef STAT
  529.     if ( eqtb [ 5299 ] .cint > 0 ) 
  530.     {
  531.       begindiagnostic () ; 
  532.       printnl ( 787 ) ; 
  533.     } 
  534. #endif /* STAT */
  535.     secondpass = false ; 
  536.   } 
  537.   else {
  538.       
  539.     threshold = eqtb [ 5268 ] .cint ; 
  540.     secondpass = true ; 
  541.     ;
  542. #ifdef STAT
  543.     if ( eqtb [ 5299 ] .cint > 0 ) 
  544.     begindiagnostic () ; 
  545. #endif /* STAT */
  546.   } 
  547.   while ( true ) {
  548.       
  549.     q = getnode ( 3 ) ; 
  550.     mem [ q ] .hh.b0 = 0 ; 
  551.     mem [ q ] .hh.b1 = 2 ; 
  552.     mem [ q ] .hh .v.RH = memtop - 7 ; 
  553.     mem [ q + 1 ] .hh .v.RH = 0 ; 
  554.     mem [ q + 1 ] .hh .v.LH = curlist .pgfield + 1 ; 
  555.     mem [ q + 2 ] .cint = 0 ; 
  556.     mem [ memtop - 7 ] .hh .v.RH = q ; 
  557.     activewidth [ 1 ] = background [ 1 ] ; 
  558.     activewidth [ 2 ] = background [ 2 ] ; 
  559.     activewidth [ 3 ] = background [ 3 ] ; 
  560.     activewidth [ 4 ] = background [ 4 ] ; 
  561.     activewidth [ 5 ] = background [ 5 ] ; 
  562.     activewidth [ 6 ] = background [ 6 ] ; 
  563.     passive = 0 ; 
  564.     printednode = memtop - 3 ; 
  565.     passnumber = 0 ; 
  566.     fontinshortdisplay = 0 ; 
  567.     curp = mem [ memtop - 3 ] .hh .v.RH ; 
  568.     autobreaking = true ; 
  569.     prevp = curp ; 
  570.     while ( ( curp != 0 ) && ( mem [ memtop - 7 ] .hh .v.RH != memtop - 7 ) ) 
  571.     {
  572.       if ( ( curp >= himemmin ) ) 
  573.       {
  574.     prevp = curp ; 
  575.     do {
  576.         f = mem [ curp ] .hh.b0 ; 
  577.       activewidth [ 1 ] = activewidth [ 1 ] + fontinfo [ widthbase [ f ] + 
  578.       fontinfo [ charbase [ f ] + mem [ curp ] .hh.b1 ] .qqqq .b0 ] .cint 
  579.       ; 
  580.       curp = mem [ curp ] .hh .v.RH ; 
  581.     } while ( ! ( ! ( curp >= himemmin ) ) ) ; 
  582.       } 
  583.       switch ( mem [ curp ] .hh.b0 ) 
  584.       {case 0 : 
  585.       case 1 : 
  586.       case 2 : 
  587.     activewidth [ 1 ] = activewidth [ 1 ] + mem [ curp + 1 ] .cint ; 
  588.     break ; 
  589.       case 8 : 
  590.     ; 
  591.     break ; 
  592.       case 10 : 
  593.     {
  594.       if ( autobreaking ) 
  595.       {
  596.         if ( ( prevp >= himemmin ) ) 
  597.         trybreak ( 0 , 0 ) ; 
  598.         else if ( ( mem [ prevp ] .hh.b0 < 9 ) ) 
  599.         trybreak ( 0 , 0 ) ; 
  600.       } 
  601.       {
  602.         if ( ( mem [ mem [ curp + 1 ] .hh .v.LH ] .hh.b1 != 0 ) && ( mem [ 
  603.         mem [ curp + 1 ] .hh .v.LH + 3 ] .cint != 0 ) ) 
  604.         {
  605.           mem [ curp + 1 ] .hh .v.LH = finiteshrink ( mem [ curp + 1 ] .hh 
  606.           .v.LH ) ; 
  607.         } 
  608.         q = mem [ curp + 1 ] .hh .v.LH ; 
  609.         activewidth [ 1 ] = activewidth [ 1 ] + mem [ q + 1 ] .cint ; 
  610.         activewidth [ 2 + mem [ q ] .hh.b0 ] = activewidth [ 2 + mem [ q ] 
  611.         .hh.b0 ] + mem [ q + 2 ] .cint ; 
  612.         activewidth [ 6 ] = activewidth [ 6 ] + mem [ q + 3 ] .cint ; 
  613.       } 
  614.       if ( secondpass && autobreaking ) 
  615.       {
  616.         s = mem [ curp ] .hh .v.RH ; 
  617.         if ( s != 0 ) 
  618.         {
  619.           while ( true ) {
  620.           
  621.         if ( ( s >= himemmin ) ) 
  622.         {
  623.           c = mem [ s ] .hh.b1 ; 
  624.           hf = mem [ s ] .hh.b0 ; 
  625.         } 
  626.         else if ( mem [ s ] .hh.b0 == 6 ) 
  627.         {
  628.           q = mem [ s + 1 ] .hh .v.RH ; 
  629.           c = mem [ q ] .hh.b1 ; 
  630.           hf = mem [ q ] .hh.b0 ; 
  631.         } 
  632.         else if ( ( mem [ s ] .hh.b0 == 11 ) && ( mem [ s ] .hh.b1 == 
  633.         0 ) ) 
  634.         c = 128 ; 
  635.         else if ( mem [ s ] .hh.b0 == 8 ) 
  636.         c = 128 ; 
  637.         else goto lab31 ; 
  638.         if ( c < 128 ) 
  639.         if ( eqtb [ 4755 + c ] .hh .v.RH != 0 ) 
  640.         if ( ( eqtb [ 4755 + c ] .hh .v.RH == c ) || ( eqtb [ 5305 ] 
  641.         .cint > 0 ) ) 
  642.         goto lab32 ; 
  643.         else goto lab31 ; 
  644.         s = mem [ s ] .hh .v.RH ; 
  645.           } 
  646.           lab32: hyfchar = hyphenchar [ hf ] ; 
  647.           if ( hyfchar < 0 ) 
  648.           goto lab31 ; 
  649.           if ( hyfchar > 255 ) 
  650.           goto lab31 ; 
  651.           ha = s ; 
  652.           hn = 0 ; 
  653.           while ( true ) {
  654.           
  655.         if ( ( s >= himemmin ) ) 
  656.         {
  657.           if ( mem [ s ] .hh.b0 != hf ) 
  658.           goto lab33 ; 
  659.           c = mem [ s ] .hh.b1 ; 
  660.           if ( c >= 128 ) 
  661.           goto lab33 ; 
  662.           if ( ( eqtb [ 4755 + c ] .hh .v.RH == 0 ) || ( hn == 63 ) ) 
  663.           goto lab33 ; 
  664.           hb = s ; 
  665.           incr ( hn ) ; 
  666.           hu [ hn ] = c ; 
  667.           hc [ hn ] = eqtb [ 4755 + c ] .hh .v.RH - 1 ; 
  668.         } 
  669.         else if ( mem [ s ] .hh.b0 == 6 ) 
  670.         {
  671.           j = hn ; 
  672.           q = mem [ s + 1 ] .hh .v.RH ; 
  673.           if ( mem [ q ] .hh.b0 != hf ) 
  674.           goto lab33 ; 
  675.           do {
  676.               c = mem [ q ] .hh.b1 ; 
  677.             if ( c >= 128 ) 
  678.             goto lab33 ; 
  679.             if ( ( eqtb [ 4755 + c ] .hh .v.RH == 0 ) || ( j == 63 ) ) 
  680.             goto lab33 ; 
  681.             incr ( j ) ; 
  682.             hu [ j ] = c ; 
  683.             hc [ j ] = eqtb [ 4755 + c ] .hh .v.RH - 1 ; 
  684.             q = mem [ q ] .hh .v.RH ; 
  685.           } while ( ! ( q == 0 ) ) ; 
  686.           hb = s ; 
  687.           hn = j ; 
  688.         } 
  689.         else if ( ( mem [ s ] .hh.b0 != 11 ) || ( mem [ s ] .hh.b1 != 
  690.         0 ) ) 
  691.         goto lab33 ; 
  692.         s = mem [ s ] .hh .v.RH ; 
  693.           } 
  694.           lab33: ; 
  695.           if ( hn < 5 ) 
  696.           goto lab31 ; 
  697.           while ( true ) {
  698.           
  699.         if ( ! ( ( s >= himemmin ) ) ) 
  700.         switch ( mem [ s ] .hh.b0 ) 
  701.         {case 6 : 
  702.           ; 
  703.           break ; 
  704.         case 11 : 
  705.           if ( mem [ s ] .hh.b1 != 0 ) 
  706.           goto lab34 ; 
  707.           break ; 
  708.         case 8 : 
  709.         case 10 : 
  710.         case 12 : 
  711.         case 3 : 
  712.         case 5 : 
  713.         case 4 : 
  714.           goto lab34 ; 
  715.           break ; 
  716.           default: 
  717.           goto lab31 ; 
  718.           break ; 
  719.         } 
  720.         s = mem [ s ] .hh .v.RH ; 
  721.           } 
  722.           lab34: ; 
  723.           hyphenate () ; 
  724.         } 
  725.         lab31: ; 
  726.       } 
  727.     } 
  728.     break ; 
  729.       case 11 : 
  730.     {
  731.       if ( ! ( mem [ curp ] .hh .v.RH >= himemmin ) && autobreaking ) 
  732.       if ( mem [ mem [ curp ] .hh .v.RH ] .hh.b0 == 10 ) 
  733.       trybreak ( 0 , 0 ) ; 
  734.       activewidth [ 1 ] = activewidth [ 1 ] + mem [ curp + 1 ] .cint ; 
  735.     } 
  736.     break ; 
  737.       case 6 : 
  738.     {
  739.       f = mem [ curp + 1 ] .hh.b0 ; 
  740.       activewidth [ 1 ] = activewidth [ 1 ] + fontinfo [ widthbase [ f ] + 
  741.       fontinfo [ charbase [ f ] + mem [ curp + 1 ] .hh.b1 ] .qqqq .b0 ] 
  742.       .cint ; 
  743.     } 
  744.     break ; 
  745.       case 7 : 
  746.     {
  747.       s = mem [ curp + 1 ] .hh .v.LH ; 
  748.       discwidth = 0 ; 
  749.       if ( s == 0 ) 
  750.       trybreak ( eqtb [ 5271 ] .cint , 1 ) ; 
  751.       else {
  752.           
  753.         do {
  754.         if ( ( s >= himemmin ) ) 
  755.           {
  756.         f = mem [ s ] .hh.b0 ; 
  757.         discwidth = discwidth + fontinfo [ widthbase [ f ] + fontinfo 
  758.         [ charbase [ f ] + mem [ s ] .hh.b1 ] .qqqq .b0 ] .cint ; 
  759.           } 
  760.           else switch ( mem [ s ] .hh.b0 ) 
  761.           {case 6 : 
  762.         {
  763.           f = mem [ s + 1 ] .hh.b0 ; 
  764.           discwidth = discwidth + fontinfo [ widthbase [ f ] + 
  765.           fontinfo [ charbase [ f ] + mem [ s + 1 ] .hh.b1 ] .qqqq .b0 
  766.           ] .cint ; 
  767.         } 
  768.         break ; 
  769.           case 0 : 
  770.           case 1 : 
  771.           case 2 : 
  772.           case 11 : 
  773.         discwidth = discwidth + mem [ s + 1 ] .cint ; 
  774.         break ; 
  775.         default: 
  776.         confusion ( 790 ) ; 
  777.         break ; 
  778.           } 
  779.           s = mem [ s ] .hh .v.RH ; 
  780.         } while ( ! ( s == 0 ) ) ; 
  781.         activewidth [ 1 ] = activewidth [ 1 ] + discwidth ; 
  782.         trybreak ( eqtb [ 5270 ] .cint , 1 ) ; 
  783.         activewidth [ 1 ] = activewidth [ 1 ] - discwidth ; 
  784.       } 
  785.     } 
  786.     break ; 
  787.       case 9 : 
  788.     {
  789.       autobreaking = ( mem [ curp ] .hh.b1 == 1 ) ; 
  790.       {
  791.         if ( ! ( mem [ curp ] .hh .v.RH >= himemmin ) && autobreaking ) 
  792.         if ( mem [ mem [ curp ] .hh .v.RH ] .hh.b0 == 10 ) 
  793.         trybreak ( 0 , 0 ) ; 
  794.         activewidth [ 1 ] = activewidth [ 1 ] + mem [ curp + 1 ] .cint ; 
  795.       } 
  796.     } 
  797.     break ; 
  798.       case 12 : 
  799.     trybreak ( mem [ curp + 1 ] .cint , 0 ) ; 
  800.     break ; 
  801.       case 4 : 
  802.       case 3 : 
  803.       case 5 : 
  804.     ; 
  805.     break ; 
  806.     default: 
  807.     confusion ( 789 ) ; 
  808.     break ; 
  809.       } 
  810.       prevp = curp ; 
  811.       curp = mem [ curp ] .hh .v.RH ; 
  812.     } 
  813.     if ( curp == 0 ) 
  814.     {
  815.       trybreak ( -10000 , 1 ) ; 
  816.       if ( mem [ memtop - 7 ] .hh .v.RH != memtop - 7 ) 
  817.       {
  818.     r = mem [ memtop - 7 ] .hh .v.RH ; 
  819.     fewestdemerits = 1073741823L ; 
  820.     do {
  821.         if ( mem [ r ] .hh.b0 != 2 ) 
  822.       if ( mem [ r + 2 ] .cint < fewestdemerits ) 
  823.       {
  824.         fewestdemerits = mem [ r + 2 ] .cint ; 
  825.         bestbet = r ; 
  826.       } 
  827.       r = mem [ r ] .hh .v.RH ; 
  828.     } while ( ! ( r == memtop - 7 ) ) ; 
  829.     bestline = mem [ bestbet + 1 ] .hh .v.LH ; 
  830.     if ( eqtb [ 5286 ] .cint == 0 ) 
  831.     goto lab30 ; 
  832.     {
  833.       r = mem [ memtop - 7 ] .hh .v.RH ; 
  834.       actuallooseness = 0 ; 
  835.       do {
  836.           if ( mem [ r ] .hh.b0 != 2 ) 
  837.         {
  838.           linediff = mem [ r + 1 ] .hh .v.LH - bestline ; 
  839.           if ( ( ( linediff < actuallooseness ) && ( eqtb [ 5286 ] .cint 
  840.           <= linediff ) ) || ( ( linediff > actuallooseness ) && ( eqtb [ 
  841.           5286 ] .cint >= linediff ) ) ) 
  842.           {
  843.         bestbet = r ; 
  844.         actuallooseness = linediff ; 
  845.         fewestdemerits = mem [ r + 2 ] .cint ; 
  846.           } 
  847.           else if ( ( linediff == actuallooseness ) && ( mem [ r + 2 ] 
  848.           .cint < fewestdemerits ) ) 
  849.           {
  850.         bestbet = r ; 
  851.         fewestdemerits = mem [ r + 2 ] .cint ; 
  852.           } 
  853.         } 
  854.         r = mem [ r ] .hh .v.RH ; 
  855.       } while ( ! ( r == memtop - 7 ) ) ; 
  856.       bestline = mem [ bestbet + 1 ] .hh .v.LH ; 
  857.     } 
  858.     if ( ( actuallooseness == eqtb [ 5286 ] .cint ) || secondpass ) 
  859.     goto lab30 ; 
  860.       } 
  861.     } 
  862.     q = mem [ memtop - 7 ] .hh .v.RH ; 
  863.     while ( q != memtop - 7 ) {
  864.     
  865.       curp = mem [ q ] .hh .v.RH ; 
  866.       if ( mem [ q ] .hh.b0 == 2 ) 
  867.       freenode ( q , 7 ) ; 
  868.       else freenode ( q , 3 ) ; 
  869.       q = curp ; 
  870.     } 
  871.     q = passive ; 
  872.     while ( q != 0 ) {
  873.     
  874.       curp = mem [ q ] .hh .v.RH ; 
  875.       freenode ( q , 2 ) ; 
  876.       q = curp ; 
  877.     } 
  878.     ;
  879. #ifdef STAT
  880.     if ( eqtb [ 5299 ] .cint > 0 ) 
  881.     printnl ( 788 ) ; 
  882. #endif /* STAT */
  883.     threshold = eqtb [ 5268 ] .cint ; 
  884.     secondpass = true ; 
  885.   } 
  886.   lab30: 
  887.     ;
  888. #ifdef STAT
  889.   if ( eqtb [ 5299 ] .cint > 0 ) 
  890.   enddiagnostic ( true ) ; 
  891. #endif /* STAT */
  892.   postlinebreak ( finalwidowpenalty ) ; 
  893.   q = mem [ memtop - 7 ] .hh .v.RH ; 
  894.   while ( q != memtop - 7 ) {
  895.       
  896.     curp = mem [ q ] .hh .v.RH ; 
  897.     if ( mem [ q ] .hh.b0 == 2 ) 
  898.     freenode ( q , 7 ) ; 
  899.     else freenode ( q , 3 ) ; 
  900.     q = curp ; 
  901.   } 
  902.   q = passive ; 
  903.   while ( q != 0 ) {
  904.       
  905.     curp = mem [ q ] .hh .v.RH ; 
  906.     freenode ( q , 2 ) ; 
  907.     q = curp ; 
  908.   } 
  909.   packbeginline = 0 ; 
  910. newhyphexceptions () {
  911.     /* 21 10 40 45 30 */ newhyphexceptions_regmem 
  912.   smallnumber n  ; 
  913.   smallnumber j  ; 
  914.   hyphpointer h  ; 
  915.   strnumber k  ; 
  916.   halfword p  ; 
  917.   halfword q  ; 
  918.   strnumber s, t  ; 
  919.   poolpointer u, v  ; 
  920.   scanleftbrace () ; 
  921.   n = 0 ; 
  922.   p = 0 ; 
  923.   while ( true ) {
  924.       
  925.     getxtoken () ; 
  926.     lab21: switch ( curcmd ) 
  927.     {case 11 : 
  928.     case 12 : 
  929.     case 67 : 
  930.       if ( curchr == 45 ) 
  931.       {
  932.     if ( n > 1 ) 
  933.     {
  934.       q = getavail () ; 
  935.       mem [ q ] .hh .v.RH = p ; 
  936.       mem [ q ] .hh .v.LH = n ; 
  937.       p = q ; 
  938.     } 
  939.       } 
  940.       else {
  941.       
  942.     if ( ( curchr > 127 ) || ( eqtb [ 4755 + curchr ] .hh .v.RH == 0 ) ) 
  943.     {
  944.       {
  945.         if ( interaction == 3 ) 
  946.         wakeupterminal () ; 
  947.         printnl ( 133 ) ; 
  948.         print ( 797 ) ; 
  949.       } 
  950.       {
  951.         helpptr = 2 ; 
  952.         helpline [ 1 ] = 798 ; 
  953.         helpline [ 0 ] = 799 ; 
  954.       } 
  955.       error () ; 
  956.     } 
  957.     else if ( n < 63 ) 
  958.     {
  959.       incr ( n ) ; 
  960.       hc [ n ] = eqtb [ 4755 + curchr ] .hh .v.RH - 1 ; 
  961.     } 
  962.       } 
  963.       break ; 
  964.     case 16 : 
  965.       {
  966.     scancharnum () ; 
  967.     curchr = curval ; 
  968.     curcmd = 67 ; 
  969.     goto lab21 ; 
  970.       } 
  971.       break ; 
  972.     case 10 : 
  973.     case 2 : 
  974.       {
  975.     if ( n > 4 ) 
  976.     {
  977.       {
  978.         if ( poolptr + n > poolsize ) 
  979.         overflow ( 128 , poolsize - initpoolptr ) ; 
  980.       } 
  981.       h = 0 ; 
  982.       {register integer for_end; j = 1 ; for_end = n ; if ( j <= for_end) 
  983.       do 
  984.         {
  985.           h = ( h + h + hc [ j ] ) % 307 ; 
  986.           {
  987.         strpool [ poolptr ] = hc [ j ] ; 
  988.         incr ( poolptr ) ; 
  989.           } 
  990.         } 
  991.       while ( j++ < for_end ) ; } 
  992.       s = makestring () ; 
  993.       while ( true ) {
  994.           
  995.         if ( p == 0 ) 
  996.         goto lab30 ; 
  997.         if ( mem [ p ] .hh .v.LH < n - 2 ) 
  998.         goto lab30 ; 
  999.         q = mem [ p ] .hh .v.RH ; 
  1000.         {
  1001.           mem [ p ] .hh .v.RH = avail ; 
  1002.           avail = p ; 
  1003.     ;
  1004. #ifdef STAT
  1005.           decr ( dynused ) ; 
  1006. #endif /* STAT */
  1007.         } 
  1008.         p = q ; 
  1009.       } 
  1010.       lab30: if ( hyphcount == 307 ) 
  1011.       overflow ( 800 , 307 ) ; 
  1012.       incr ( hyphcount ) ; 
  1013.       while ( hyphword [ h ] != 0 ) {
  1014.           
  1015.         k = hyphword [ h ] ; 
  1016.         if ( ( strstart [ k + 1 ] - strstart [ k ] ) < ( strstart [ s + 1 
  1017.         ] - strstart [ s ] ) ) 
  1018.         goto lab40 ; 
  1019.         if ( ( strstart [ k + 1 ] - strstart [ k ] ) > ( strstart [ s + 1 
  1020.         ] - strstart [ s ] ) ) 
  1021.         goto lab45 ; 
  1022.         u = strstart [ k ] ; 
  1023.         v = strstart [ s ] ; 
  1024.         do {
  1025.         if ( strpool [ u ] < strpool [ v ] ) 
  1026.           goto lab40 ; 
  1027.           if ( strpool [ u ] > strpool [ v ] ) 
  1028.           goto lab45 ; 
  1029.           incr ( u ) ; 
  1030.           incr ( v ) ; 
  1031.         } while ( ! ( u == strstart [ k + 1 ] ) ) ; 
  1032.         lab40: q = hyphlist [ h ] ; 
  1033.         hyphlist [ h ] = p ; 
  1034.         p = q ; 
  1035.         t = hyphword [ h ] ; 
  1036.         hyphword [ h ] = s ; 
  1037.         s = t ; 
  1038.         lab45: ; 
  1039.         if ( h > 0 ) 
  1040.         decr ( h ) ; 
  1041.         else h = 307 ; 
  1042.       } 
  1043.       hyphword [ h ] = s ; 
  1044.       hyphlist [ h ] = p ; 
  1045.     } 
  1046.     if ( curcmd == 2 ) 
  1047.     return ; 
  1048.     n = 0 ; 
  1049.     p = 0 ; 
  1050.       } 
  1051.       break ; 
  1052.       default: 
  1053.       {
  1054.     {
  1055.       if ( interaction == 3 ) 
  1056.       wakeupterminal () ; 
  1057.       printnl ( 133 ) ; 
  1058.       print ( 536 ) ; 
  1059.     } 
  1060.     printesc ( 793 ) ; 
  1061.     print ( 794 ) ; 
  1062.     {
  1063.       helpptr = 2 ; 
  1064.       helpline [ 1 ] = 795 ; 
  1065.       helpline [ 0 ] = 796 ; 
  1066.     } 
  1067.     error () ; 
  1068.       } 
  1069.       break ; 
  1070.     } 
  1071.   } 
  1072. halfword zprunepagetop ( p ) 
  1073. halfword p ; 
  1074. {register halfword Result; prunepagetop_regmem 
  1075.   halfword prevp  ; 
  1076.   halfword q  ; 
  1077.   prevp = memtop - 3 ; 
  1078.   mem [ memtop - 3 ] .hh .v.RH = p ; 
  1079.   while ( p != 0 ) switch ( mem [ p ] .hh.b0 ) 
  1080.   {case 0 : 
  1081.   case 1 : 
  1082.   case 2 : 
  1083.     {
  1084.       q = newskipparam ( 10 ) ; 
  1085.       mem [ prevp ] .hh .v.RH = q ; 
  1086.       mem [ q ] .hh .v.RH = p ; 
  1087.       if ( mem [ tempptr + 1 ] .cint > mem [ p + 3 ] .cint ) 
  1088.       mem [ tempptr + 1 ] .cint = mem [ tempptr + 1 ] .cint - mem [ p + 3 ] 
  1089.       .cint ; 
  1090.       else mem [ tempptr + 1 ] .cint = 0 ; 
  1091.       p = 0 ; 
  1092.     } 
  1093.     break ; 
  1094.   case 8 : 
  1095.   case 4 : 
  1096.   case 3 : 
  1097.     {
  1098.       prevp = p ; 
  1099.       p = mem [ prevp ] .hh .v.RH ; 
  1100.     } 
  1101.     break ; 
  1102.   case 10 : 
  1103.   case 11 : 
  1104.   case 12 : 
  1105.     {
  1106.       q = p ; 
  1107.       p = mem [ q ] .hh .v.RH ; 
  1108.       mem [ q ] .hh .v.RH = 0 ; 
  1109.       mem [ prevp ] .hh .v.RH = p ; 
  1110.       flushnodelist ( q ) ; 
  1111.     } 
  1112.     break ; 
  1113.     default: 
  1114.     confusion ( 807 ) ; 
  1115.     break ; 
  1116.   } 
  1117.   Result = mem [ memtop - 3 ] .hh .v.RH ; 
  1118.   return(Result) ; 
  1119. halfword zvertbreak ( p , h , d ) 
  1120. halfword p ; 
  1121. scaled h , d ; 
  1122. {/* 30 45 90 */ register halfword Result; vertbreak_regmem 
  1123.   halfword prevp  ; 
  1124.   halfword q, r  ; 
  1125.   integer pi  ; 
  1126.   integer b  ; 
  1127.   integer leastcost  ; 
  1128.   halfword bestplace  ; 
  1129.   scaled prevdp  ; 
  1130.   smallnumber t  ; 
  1131.   prevp = p ; 
  1132.   leastcost = 1073741823L ; 
  1133.   activewidth [ 1 ] = 0 ; 
  1134.   activewidth [ 2 ] = 0 ; 
  1135.   activewidth [ 3 ] = 0 ; 
  1136.   activewidth [ 4 ] = 0 ; 
  1137.   activewidth [ 5 ] = 0 ; 
  1138.   activewidth [ 6 ] = 0 ; 
  1139.   prevdp = 0 ; 
  1140.   while ( true ) {
  1141.       
  1142.     if ( p == 0 ) 
  1143.     pi = -10000 ; 
  1144.     else switch ( mem [ p ] .hh.b0 ) 
  1145.     {case 0 : 
  1146.     case 1 : 
  1147.     case 2 : 
  1148.       {
  1149.     activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [ p + 3 ] .cint ; 
  1150.     prevdp = mem [ p + 2 ] .cint ; 
  1151.     goto lab45 ; 
  1152.       } 
  1153.       break ; 
  1154.     case 8 : 
  1155.       goto lab45 ; 
  1156.       break ; 
  1157.     case 10 : 
  1158.       if ( ( mem [ prevp ] .hh.b0 < 9 ) ) 
  1159.       pi = 0 ; 
  1160.       else goto lab90 ; 
  1161.       break ; 
  1162.     case 11 : 
  1163.       {
  1164.     if ( mem [ p ] .hh .v.RH == 0 ) 
  1165.     t = 12 ; 
  1166.     else t = mem [ mem [ p ] .hh .v.RH ] .hh.b0 ; 
  1167.     if ( t == 10 ) 
  1168.     pi = 0 ; 
  1169.     else goto lab90 ; 
  1170.       } 
  1171.       break ; 
  1172.     case 12 : 
  1173.       pi = mem [ p + 1 ] .cint ; 
  1174.       break ; 
  1175.     case 4 : 
  1176.     case 3 : 
  1177.       goto lab45 ; 
  1178.       break ; 
  1179.       default: 
  1180.       confusion ( 808 ) ; 
  1181.       break ; 
  1182.     } 
  1183.     if ( pi < 10000 ) 
  1184.     {
  1185.       if ( activewidth [ 1 ] < h ) 
  1186.       if ( ( activewidth [ 3 ] != 0 ) || ( activewidth [ 4 ] != 0 ) || ( 
  1187.       activewidth [ 5 ] != 0 ) ) 
  1188.       b = 0 ; 
  1189.       else b = badness ( h - activewidth [ 1 ] , activewidth [ 2 ] ) ; 
  1190.       else if ( activewidth [ 1 ] - h > activewidth [ 6 ] ) 
  1191.       b = 1073741823L ; 
  1192.       else b = badness ( activewidth [ 1 ] - h , activewidth [ 6 ] ) ; 
  1193.       if ( b < 1073741823L ) 
  1194.       if ( pi <= -10000 ) 
  1195.       b = pi ; 
  1196.       else if ( b < 10000 ) 
  1197.       b = b + pi ; 
  1198.       else b = 100000L ; 
  1199.       if ( b <= leastcost ) 
  1200.       {
  1201.     bestplace = p ; 
  1202.     leastcost = b ; 
  1203.     bestheightplusdepth = activewidth [ 1 ] + prevdp ; 
  1204.       } 
  1205.       if ( ( b == 1073741823L ) || ( pi <= -10000 ) ) 
  1206.       goto lab30 ; 
  1207.     } 
  1208.     if ( ( mem [ p ] .hh.b0 < 10 ) || ( mem [ p ] .hh.b0 > 11 ) ) 
  1209.     goto lab45 ; 
  1210.     lab90: if ( mem [ p ] .hh.b0 == 11 ) 
  1211.     q = p ; 
  1212.     else {
  1213.     
  1214.       q = mem [ p + 1 ] .hh .v.LH ; 
  1215.       activewidth [ 2 + mem [ q ] .hh.b0 ] = activewidth [ 2 + mem [ q ] 
  1216.       .hh.b0 ] + mem [ q + 2 ] .cint ; 
  1217.       activewidth [ 6 ] = activewidth [ 6 ] + mem [ q + 3 ] .cint ; 
  1218.       if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) ) 
  1219.       {
  1220.     {
  1221.       if ( interaction == 3 ) 
  1222.       wakeupterminal () ; 
  1223.       printnl ( 133 ) ; 
  1224.       print ( 809 ) ; 
  1225.     } 
  1226.     {
  1227.       helpptr = 4 ; 
  1228.       helpline [ 3 ] = 810 ; 
  1229.       helpline [ 2 ] = 811 ; 
  1230.       helpline [ 1 ] = 812 ; 
  1231.       helpline [ 0 ] = 776 ; 
  1232.     } 
  1233.     error () ; 
  1234.     r = newspec ( q ) ; 
  1235.     mem [ r ] .hh.b1 = 0 ; 
  1236.     deleteglueref ( q ) ; 
  1237.     mem [ p + 1 ] .hh .v.LH = r ; 
  1238.       } 
  1239.     } 
  1240.     activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [ q + 1 ] .cint ; 
  1241.     prevdp = 0 ; 
  1242.     lab45: if ( prevdp > d ) 
  1243.     {
  1244.       activewidth [ 1 ] = activewidth [ 1 ] + prevdp - d ; 
  1245.       prevdp = d ; 
  1246.     } 
  1247.     prevp = p ; 
  1248.     p = mem [ prevp ] .hh .v.RH ; 
  1249.   } 
  1250.   lab30: Result = bestplace ; 
  1251.   return(Result) ; 
  1252. halfword zvsplit ( n , h ) 
  1253. eightbits n ; 
  1254. scaled h ; 
  1255. {/* 10 30 */ register halfword Result; vsplit_regmem 
  1256.   halfword v  ; 
  1257.   halfword p  ; 
  1258.   halfword q  ; 
  1259.   v = eqtb [ 4322 + n ] .hh .v.RH ; 
  1260.   if ( curmark [ 3 ] != 0 ) 
  1261.   {
  1262.     deletetokenref ( curmark [ 3 ] ) ; 
  1263.     curmark [ 3 ] = 0 ; 
  1264.     deletetokenref ( curmark [ 4 ] ) ; 
  1265.     curmark [ 4 ] = 0 ; 
  1266.   } 
  1267.   if ( v == 0 ) 
  1268.   {
  1269.     Result = 0 ; 
  1270.     return(Result) ; 
  1271.   } 
  1272.   if ( mem [ v ] .hh.b0 != 1 ) 
  1273.   {
  1274.     {
  1275.       if ( interaction == 3 ) 
  1276.       wakeupterminal () ; 
  1277.       printnl ( 133 ) ; 
  1278.       print ( 206 ) ; 
  1279.     } 
  1280.     printesc ( 813 ) ; 
  1281.     print ( 814 ) ; 
  1282.     printesc ( 815 ) ; 
  1283.     {
  1284.       helpptr = 2 ; 
  1285.       helpline [ 1 ] = 816 ; 
  1286.       helpline [ 0 ] = 817 ; 
  1287.     } 
  1288.     error () ; 
  1289.     Result = 0 ; 
  1290.     return(Result) ; 
  1291.   } 
  1292.   q = vertbreak ( mem [ v + 5 ] .hh .v.RH , h , eqtb [ 5707 ] .cint ) ; 
  1293.   p = mem [ v + 5 ] .hh .v.RH ; 
  1294.   if ( p == q ) 
  1295.   mem [ v + 5 ] .hh .v.RH = 0 ; 
  1296.   else while ( true ) {
  1297.       
  1298.     if ( mem [ p ] .hh.b0 == 4 ) 
  1299.     if ( curmark [ 3 ] == 0 ) 
  1300.     {
  1301.       curmark [ 3 ] = mem [ p + 1 ] .cint ; 
  1302.       curmark [ 4 ] = curmark [ 3 ] ; 
  1303.       mem [ curmark [ 3 ] ] .hh .v.LH = mem [ curmark [ 3 ] ] .hh .v.LH + 2 ; 
  1304.     } 
  1305.     else {
  1306.     
  1307.       deletetokenref ( curmark [ 4 ] ) ; 
  1308.       curmark [ 4 ] = mem [ p + 1 ] .cint ; 
  1309.       incr ( mem [ curmark [ 4 ] ] .hh .v.LH ) ; 
  1310.     } 
  1311.     if ( mem [ p ] .hh .v.RH == q ) 
  1312.     {
  1313.       mem [ p ] .hh .v.RH = 0 ; 
  1314.       goto lab30 ; 
  1315.     } 
  1316.     p = mem [ p ] .hh .v.RH ; 
  1317.   } 
  1318.   lab30: ; 
  1319.   q = prunepagetop ( q ) ; 
  1320.   p = mem [ v + 5 ] .hh .v.RH ; 
  1321.   freenode ( v , 7 ) ; 
  1322.   if ( q == 0 ) 
  1323.   eqtb [ 4322 + n ] .hh .v.RH = 0 ; 
  1324.   else eqtb [ 4322 + n ] .hh .v.RH = vpackage ( q , 0 , 1 , 1073741823L ) ; 
  1325.   Result = vpackage ( p , h , 0 , eqtb [ 5707 ] .cint ) ; 
  1326.   return(Result) ; 
  1327. printtotals () {
  1328.     printtotals_regmem 
  1329.   printscaled ( pagesofar [ 1 ] ) ; 
  1330.   if ( pagesofar [ 2 ] != 0 ) 
  1331.   {
  1332.     print ( 181 ) ; 
  1333.     printscaled ( pagesofar [ 2 ] ) ; 
  1334.     print ( 206 ) ; 
  1335.   } 
  1336.   if ( pagesofar [ 3 ] != 0 ) 
  1337.   {
  1338.     print ( 181 ) ; 
  1339.     printscaled ( pagesofar [ 3 ] ) ; 
  1340.     print ( 180 ) ; 
  1341.   } 
  1342.   if ( pagesofar [ 4 ] != 0 ) 
  1343.   {
  1344.     print ( 181 ) ; 
  1345.     printscaled ( pagesofar [ 4 ] ) ; 
  1346.     print ( 826 ) ; 
  1347.   } 
  1348.   if ( pagesofar [ 5 ] != 0 ) 
  1349.   {
  1350.     print ( 181 ) ; 
  1351.     printscaled ( pagesofar [ 5 ] ) ; 
  1352.     print ( 827 ) ; 
  1353.   } 
  1354.   if ( pagesofar [ 6 ] != 0 ) 
  1355.   {
  1356.     print ( 182 ) ; 
  1357.     printscaled ( pagesofar [ 6 ] ) ; 
  1358.   } 
  1359. zfreezepagespecs ( s ) 
  1360. smallnumber s ; 
  1361. {freezepagespecs_regmem 
  1362.   pagecontents = s ; 
  1363.   pagesofar [ 0 ] = eqtb [ 5705 ] .cint ; 
  1364.   pagemaxdepth = eqtb [ 5706 ] .cint ; 
  1365.   pagesofar [ 7 ] = 0 ; 
  1366.   pagesofar [ 1 ] = 0 ; 
  1367.   pagesofar [ 2 ] = 0 ; 
  1368.   pagesofar [ 3 ] = 0 ; 
  1369.   pagesofar [ 4 ] = 0 ; 
  1370.   pagesofar [ 5 ] = 0 ; 
  1371.   pagesofar [ 6 ] = 0 ; 
  1372.   leastpagecost = 1073741823L ; 
  1373.     ;
  1374. #ifdef STAT
  1375.   if ( eqtb [ 5300 ] .cint > 0 ) 
  1376.   {
  1377.     begindiagnostic () ; 
  1378.     printnl ( 835 ) ; 
  1379.     printscaled ( pagesofar [ 0 ] ) ; 
  1380.     print ( 836 ) ; 
  1381.     printscaled ( pagemaxdepth ) ; 
  1382.     enddiagnostic ( false ) ; 
  1383.   } 
  1384. #endif /* STAT */
  1385. zboxerror ( n ) 
  1386. eightbits n ; 
  1387. {boxerror_regmem 
  1388.   error () ; 
  1389.   begindiagnostic () ; 
  1390.   printnl ( 689 ) ; 
  1391.   showbox ( eqtb [ 4322 + n ] .hh .v.RH ) ; 
  1392.   enddiagnostic ( true ) ; 
  1393.   flushnodelist ( eqtb [ 4322 + n ] .hh .v.RH ) ; 
  1394.   eqtb [ 4322 + n ] .hh .v.RH = 0 ; 
  1395. zensurevbox ( n ) 
  1396. eightbits n ; 
  1397. {ensurevbox_regmem 
  1398.   halfword p  ; 
  1399.   p = eqtb [ 4322 + n ] .hh .v.RH ; 
  1400.   if ( p != 0 ) 
  1401.   if ( mem [ p ] .hh.b0 == 0 ) 
  1402.   {
  1403.     {
  1404.       if ( interaction == 3 ) 
  1405.       wakeupterminal () ; 
  1406.       printnl ( 133 ) ; 
  1407.       print ( 837 ) ; 
  1408.     } 
  1409.     {
  1410.       helpptr = 3 ; 
  1411.       helpline [ 2 ] = 838 ; 
  1412.       helpline [ 1 ] = 839 ; 
  1413.       helpline [ 0 ] = 840 ; 
  1414.     } 
  1415.     boxerror ( n ) ; 
  1416.   } 
  1417. zfireup ( c ) 
  1418. halfword c ; 
  1419. {/* 10 */ fireup_regmem 
  1420.   halfword p, q, r, s  ; 
  1421.   halfword prevp  ; 
  1422.   unsigned char n  ; 
  1423.   boolean wait  ; 
  1424.   integer savevbadness  ; 
  1425.   scaled savevfuzz  ; 
  1426.   halfword savesplittopskip  ; 
  1427.   if ( mem [ bestpagebreak ] .hh.b0 == 12 ) 
  1428.   {
  1429.     geqworddefine ( 5306 , mem [ bestpagebreak + 1 ] .cint ) ; 
  1430.     mem [ bestpagebreak + 1 ] .cint = 10000 ; 
  1431.   } 
  1432.   else geqworddefine ( 5306 , 10000 ) ; 
  1433.   if ( curmark [ 2 ] != 0 ) 
  1434.   {
  1435.     if ( curmark [ 0 ] != 0 ) 
  1436.     deletetokenref ( curmark [ 0 ] ) ; 
  1437.     curmark [ 0 ] = curmark [ 2 ] ; 
  1438.     incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ; 
  1439.     deletetokenref ( curmark [ 1 ] ) ; 
  1440.     curmark [ 1 ] = 0 ; 
  1441.   } 
  1442.   if ( c == bestpagebreak ) 
  1443.   bestpagebreak = 0 ; 
  1444.   if ( eqtb [ 4577 ] .hh .v.RH != 0 ) 
  1445.   {
  1446.     {
  1447.       if ( interaction == 3 ) 
  1448.       wakeupterminal () ; 
  1449.       printnl ( 133 ) ; 
  1450.       print ( 206 ) ; 
  1451.     } 
  1452.     printesc ( 274 ) ; 
  1453.     print ( 851 ) ; 
  1454.     {
  1455.       helpptr = 2 ; 
  1456.       helpline [ 1 ] = 852 ; 
  1457.       helpline [ 0 ] = 840 ; 
  1458.     } 
  1459.     boxerror ( 255 ) ; 
  1460.   } 
  1461.   insertpenalties = 0 ; 
  1462.   savesplittopskip = eqtb [ 3536 ] .hh .v.RH ; 
  1463.   r = mem [ memtop ] .hh .v.RH ; 
  1464.   while ( r != memtop ) {
  1465.       
  1466.     if ( mem [ r + 2 ] .hh .v.LH != 0 ) 
  1467.     {
  1468.       n = mem [ r ] .hh.b1 ; 
  1469.       ensurevbox ( n ) ; 
  1470.       if ( eqtb [ 4322 + n ] .hh .v.RH == 0 ) 
  1471.       eqtb [ 4322 + n ] .hh .v.RH = newnullbox () ; 
  1472.       p = eqtb [ 4322 + n ] .hh .v.RH + 5 ; 
  1473.       while ( mem [ p ] .hh .v.RH != 0 ) p = mem [ p ] .hh .v.RH ; 
  1474.       mem [ r + 2 ] .hh .v.RH = p ; 
  1475.     } 
  1476.     r = mem [ r ] .hh .v.RH ; 
  1477.   } 
  1478.   q = memtop - 4 ; 
  1479.   mem [ q ] .hh .v.RH = 0 ; 
  1480.   prevp = memtop - 2 ; 
  1481.   p = mem [ prevp ] .hh .v.RH ; 
  1482.   while ( p != bestpagebreak ) {
  1483.       
  1484.     if ( mem [ p ] .hh.b0 == 3 ) 
  1485.     {
  1486.       r = mem [ memtop ] .hh .v.RH ; 
  1487.       while ( mem [ r ] .hh.b1 != mem [ p ] .hh.b1 ) r = mem [ r ] .hh .v.RH ; 
  1488.       if ( mem [ r + 2 ] .hh .v.LH == 0 ) 
  1489.       wait = true ; 
  1490.       else {
  1491.       
  1492.     wait = false ; 
  1493.     s = mem [ p + 4 ] .hh .v.LH ; 
  1494.     mem [ mem [ r + 2 ] .hh .v.RH ] .hh .v.RH = s ; 
  1495.     s = mem [ r + 2 ] .hh .v.RH ; 
  1496.     if ( mem [ r + 2 ] .hh .v.LH == p ) 
  1497.     {
  1498.       if ( mem [ r ] .hh.b0 == 1 ) 
  1499.       if ( ( mem [ r + 1 ] .hh .v.LH == p ) && ( mem [ r + 1 ] .hh .v.RH 
  1500.       != 0 ) ) 
  1501.       {
  1502.         while ( mem [ s ] .hh .v.RH != mem [ r + 1 ] .hh .v.RH ) s = mem [ 
  1503.         s ] .hh .v.RH ; 
  1504.         eqtb [ 3536 ] .hh .v.RH = mem [ p + 4 ] .hh .v.RH ; 
  1505.         mem [ p + 4 ] .hh .v.LH = prunepagetop ( mem [ r + 1 ] .hh .v.RH ) 
  1506.         ; 
  1507.         if ( mem [ p + 4 ] .hh .v.LH != 0 ) 
  1508.         {
  1509.           tempptr = vpackage ( mem [ p + 4 ] .hh .v.LH , 0 , 1 , 
  1510.           1073741823L ) ; 
  1511.           mem [ p + 3 ] .cint = mem [ tempptr + 3 ] .cint + mem [ tempptr 
  1512.           + 2 ] .cint ; 
  1513.           freenode ( tempptr , 7 ) ; 
  1514.           wait = true ; 
  1515.         } 
  1516.         mem [ s ] .hh .v.RH = 0 ; 
  1517.       } 
  1518.       mem [ r + 2 ] .hh .v.LH = 0 ; 
  1519.       n = mem [ r ] .hh.b1 ; 
  1520.       tempptr = mem [ eqtb [ 4322 + n ] .hh .v.RH + 5 ] .hh .v.RH ; 
  1521.       freenode ( eqtb [ 4322 + n ] .hh .v.RH , 7 ) ; 
  1522.       eqtb [ 4322 + n ] .hh .v.RH = vpackage ( tempptr , 0 , 1 , 
  1523.       1073741823L ) ; 
  1524.     } 
  1525.     else {
  1526.         
  1527.       while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; 
  1528.       mem [ r + 2 ] .hh .v.RH = s ; 
  1529.     } 
  1530.       } 
  1531.       mem [ prevp ] .hh .v.RH = mem [ p ] .hh .v.RH ; 
  1532.       mem [ p ] .hh .v.RH = 0 ; 
  1533.       if ( wait ) 
  1534.       {
  1535.     mem [ q ] .hh .v.RH = p ; 
  1536.     q = p ; 
  1537.     incr ( insertpenalties ) ; 
  1538.       } 
  1539.       else {
  1540.       
  1541.     deleteglueref ( mem [ p + 4 ] .hh .v.RH ) ; 
  1542.     freenode ( p , 5 ) ; 
  1543.       } 
  1544.       p = prevp ; 
  1545.     } 
  1546.     else if ( mem [ p ] .hh.b0 == 4 ) 
  1547.     {
  1548.       if ( curmark [ 1 ] == 0 ) 
  1549.       {
  1550.     curmark [ 1 ] = mem [ p + 1 ] .cint ; 
  1551.     incr ( mem [ curmark [ 1 ] ] .hh .v.LH ) ; 
  1552.       } 
  1553.       if ( curmark [ 2 ] != 0 ) 
  1554.       deletetokenref ( curmark [ 2 ] ) ; 
  1555.       curmark [ 2 ] = mem [ p + 1 ] .cint ; 
  1556.       incr ( mem [ curmark [ 2 ] ] .hh .v.LH ) ; 
  1557.     } 
  1558.     prevp = p ; 
  1559.     p = mem [ prevp ] .hh .v.RH ; 
  1560.   } 
  1561.   eqtb [ 3536 ] .hh .v.RH = savesplittopskip ; 
  1562.   if ( p != 0 ) 
  1563.   {
  1564.     if ( mem [ memtop - 1 ] .hh .v.RH == 0 ) 
  1565.     if ( nestptr == 0 ) 
  1566.     curlist .tailfield = pagetail ; 
  1567.     else nest [ 0 ] .tailfield = pagetail ; 
  1568.     mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ; 
  1569.     mem [ memtop - 1 ] .hh .v.RH = p ; 
  1570.     mem [ prevp ] .hh .v.RH = 0 ; 
  1571.   } 
  1572.   savevbadness = eqtb [ 5294 ] .cint ; 
  1573.   eqtb [ 5294 ] .cint = 10000 ; 
  1574.   savevfuzz = eqtb [ 5710 ] .cint ; 
  1575.   eqtb [ 5710 ] .cint = 1073741823L ; 
  1576.   eqtb [ 4577 ] .hh .v.RH = vpackage ( mem [ memtop - 2 ] .hh .v.RH , bestsize 
  1577.   , 0 , pagemaxdepth ) ; 
  1578.   eqtb [ 5294 ] .cint = savevbadness ; 
  1579.   eqtb [ 5710 ] .cint = savevfuzz ; 
  1580.   if ( lastglue != 65535L ) 
  1581.   deleteglueref ( lastglue ) ; 
  1582.   pagecontents = 0 ; 
  1583.   pagetail = memtop - 2 ; 
  1584.   mem [ memtop - 2 ] .hh .v.RH = 0 ; 
  1585.   lastglue = 65535L ; 
  1586.   lastpenalty = 0 ; 
  1587.   lastkern = 0 ; 
  1588.   pagesofar [ 7 ] = 0 ; 
  1589.   pagemaxdepth = 0 ; 
  1590.   if ( q != memtop - 4 ) 
  1591.   {
  1592.     mem [ memtop - 2 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  1593.     pagetail = q ; 
  1594.   } 
  1595.   r = mem [ memtop ] .hh .v.RH ; 
  1596.   while ( r != memtop ) {
  1597.       
  1598.     q = mem [ r ] .hh .v.RH ; 
  1599.     freenode ( r , 4 ) ; 
  1600.     r = q ; 
  1601.   } 
  1602.   mem [ memtop ] .hh .v.RH = memtop ; 
  1603.   if ( ( curmark [ 0 ] != 0 ) && ( curmark [ 1 ] == 0 ) ) 
  1604.   {
  1605.     curmark [ 1 ] = curmark [ 0 ] ; 
  1606.     incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ; 
  1607.   } 
  1608.   if ( eqtb [ 4057 ] .hh .v.RH != 0 ) 
  1609.   if ( deadcycles >= eqtb [ 5307 ] .cint ) 
  1610.   {
  1611.     {
  1612.       if ( interaction == 3 ) 
  1613.       wakeupterminal () ; 
  1614.       printnl ( 133 ) ; 
  1615.       print ( 853 ) ; 
  1616.     } 
  1617.     printint ( deadcycles ) ; 
  1618.     print ( 854 ) ; 
  1619.     {
  1620.       helpptr = 3 ; 
  1621.       helpline [ 2 ] = 855 ; 
  1622.       helpline [ 1 ] = 856 ; 
  1623.       helpline [ 0 ] = 857 ; 
  1624.     } 
  1625.     error () ; 
  1626.   } 
  1627.   else {
  1628.       
  1629.     outputactive = true ; 
  1630.     incr ( deadcycles ) ; 
  1631.     pushnest () ; 
  1632.     curlist .modefield = -1 ; 
  1633.     curlist .auxfield = -65536000L ; 
  1634.     curlist .mlfield = - (integer) line ; 
  1635.     begintokenlist ( eqtb [ 4057 ] .hh .v.RH , 6 ) ; 
  1636.     newsavelevel ( 8 ) ; 
  1637.     normalparagraph () ; 
  1638.     scanleftbrace () ; 
  1639.     return ; 
  1640.   } 
  1641.   {
  1642.     if ( mem [ memtop - 2 ] .hh .v.RH != 0 ) 
  1643.     {
  1644.       if ( mem [ memtop - 1 ] .hh .v.RH == 0 ) 
  1645.       if ( nestptr == 0 ) 
  1646.       curlist .tailfield = pagetail ; 
  1647.       else nest [ 0 ] .tailfield = pagetail ; 
  1648.       else mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ; 
  1649.       mem [ memtop - 1 ] .hh .v.RH = mem [ memtop - 2 ] .hh .v.RH ; 
  1650.       mem [ memtop - 2 ] .hh .v.RH = 0 ; 
  1651.       pagetail = memtop - 2 ; 
  1652.     } 
  1653.     shipout ( eqtb [ 4577 ] .hh .v.RH ) ; 
  1654.     eqtb [ 4577 ] .hh .v.RH = 0 ; 
  1655.   } 
  1656. buildpage () {
  1657.     /* 10 30 31 22 80 90 */ buildpage_regmem 
  1658.   halfword p  ; 
  1659.   halfword q, r  ; 
  1660.   integer b, c  ; 
  1661.   integer pi  ; 
  1662.   unsigned char n  ; 
  1663.   scaled delta, h, w  ; 
  1664.   if ( ( mem [ memtop - 1 ] .hh .v.RH == 0 ) || outputactive ) 
  1665.   return ; 
  1666.   do {
  1667.       lab22: p = mem [ memtop - 1 ] .hh .v.RH ; 
  1668.     if ( lastglue != 65535L ) 
  1669.     deleteglueref ( lastglue ) ; 
  1670.     lastpenalty = 0 ; 
  1671.     lastkern = 0 ; 
  1672.     if ( mem [ p ] .hh.b0 == 10 ) 
  1673.     {
  1674.       lastglue = mem [ p + 1 ] .hh .v.LH ; 
  1675.       incr ( mem [ lastglue ] .hh .v.RH ) ; 
  1676.     } 
  1677.     else {
  1678.     
  1679.       lastglue = 65535L ; 
  1680.       if ( mem [ p ] .hh.b0 == 12 ) 
  1681.       lastpenalty = mem [ p + 1 ] .cint ; 
  1682.       else if ( mem [ p ] .hh.b0 == 11 ) 
  1683.       lastkern = mem [ p + 1 ] .cint ; 
  1684.     } 
  1685.     switch ( mem [ p ] .hh.b0 ) 
  1686.     {case 0 : 
  1687.     case 1 : 
  1688.     case 2 : 
  1689.       if ( pagecontents < 2 ) 
  1690.       {
  1691.     if ( pagecontents == 0 ) 
  1692.     freezepagespecs ( 2 ) ; 
  1693.     else pagecontents = 2 ; 
  1694.     q = newskipparam ( 9 ) ; 
  1695.     mem [ q ] .hh .v.RH = p ; 
  1696.     if ( mem [ tempptr + 1 ] .cint > mem [ p + 3 ] .cint ) 
  1697.     mem [ tempptr + 1 ] .cint = mem [ tempptr + 1 ] .cint - mem [ p + 3 ] 
  1698.     .cint ; 
  1699.     else mem [ tempptr + 1 ] .cint = 0 ; 
  1700.     mem [ q ] .hh .v.RH = p ; 
  1701.     mem [ memtop - 1 ] .hh .v.RH = q ; 
  1702.     goto lab22 ; 
  1703.       } 
  1704.       else {
  1705.       
  1706.     pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] + mem [ p + 3 ] 
  1707.     .cint ; 
  1708.     pagesofar [ 7 ] = mem [ p + 2 ] .cint ; 
  1709.     goto lab80 ; 
  1710.       } 
  1711.       break ; 
  1712.     case 8 : 
  1713.       goto lab80 ; 
  1714.       break ; 
  1715.     case 10 : 
  1716.       if ( pagecontents < 2 ) 
  1717.       goto lab31 ; 
  1718.       else if ( ( mem [ pagetail ] .hh.b0 < 9 ) ) 
  1719.       pi = 0 ; 
  1720.       else goto lab90 ; 
  1721.       break ; 
  1722.     case 11 : 
  1723.       if ( pagecontents < 2 ) 
  1724.       goto lab31 ; 
  1725.       else if ( mem [ p ] .hh .v.RH == 0 ) 
  1726.       return ; 
  1727.       else if ( mem [ mem [ p ] .hh .v.RH ] .hh.b0 == 10 ) 
  1728.       pi = 0 ; 
  1729.       else goto lab90 ; 
  1730.       break ; 
  1731.     case 12 : 
  1732.       if ( pagecontents < 2 ) 
  1733.       goto lab31 ; 
  1734.       else pi = mem [ p + 1 ] .cint ; 
  1735.       break ; 
  1736.     case 4 : 
  1737.       goto lab80 ; 
  1738.       break ; 
  1739.     case 3 : 
  1740.       {
  1741.     if ( pagecontents == 0 ) 
  1742.     freezepagespecs ( 1 ) ; 
  1743.     n = mem [ p ] .hh.b1 ; 
  1744.     r = memtop ; 
  1745.     while ( n >= mem [ mem [ r ] .hh .v.RH ] .hh.b1 ) r = mem [ r ] .hh 
  1746.     .v.RH ; 
  1747.     n = n ; 
  1748.     if ( mem [ r ] .hh.b1 != n ) 
  1749.     {
  1750.       q = getnode ( 4 ) ; 
  1751.       mem [ q ] .hh .v.RH = mem [ r ] .hh .v.RH ; 
  1752.       mem [ r ] .hh .v.RH = q ; 
  1753.       r = q ; 
  1754.       mem [ r ] .hh.b1 = n ; 
  1755.       mem [ r ] .hh.b0 = 0 ; 
  1756.       ensurevbox ( n ) ; 
  1757.       if ( eqtb [ 4322 + n ] .hh .v.RH == 0 ) 
  1758.       mem [ r + 3 ] .cint = 0 ; 
  1759.       else mem [ r + 3 ] .cint = mem [ eqtb [ 4322 + n ] .hh .v.RH + 3 ] 
  1760.       .cint + mem [ eqtb [ 4322 + n ] .hh .v.RH + 2 ] .cint ; 
  1761.       mem [ r + 2 ] .hh .v.LH = 0 ; 
  1762.       q = eqtb [ 3544 + n ] .hh .v.RH ; 
  1763.       if ( eqtb [ 5317 + n ] .cint == 1000 ) 
  1764.       h = mem [ r + 3 ] .cint ; 
  1765.       else h = xovern ( mem [ r + 3 ] .cint , 1000 ) * eqtb [ 5317 + n ] 
  1766.       .cint ; 
  1767.       pagesofar [ 0 ] = pagesofar [ 0 ] - h - mem [ q + 1 ] .cint ; 
  1768.       pagesofar [ 2 + mem [ q ] .hh.b0 ] = pagesofar [ 2 + mem [ q ] 
  1769.       .hh.b0 ] + mem [ q + 2 ] .cint ; 
  1770.       pagesofar [ 6 ] = pagesofar [ 6 ] + mem [ q + 3 ] .cint ; 
  1771.       if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) ) 
  1772.       {
  1773.         {
  1774.           if ( interaction == 3 ) 
  1775.           wakeupterminal () ; 
  1776.           printnl ( 133 ) ; 
  1777.           print ( 846 ) ; 
  1778.         } 
  1779.         printesc ( 260 ) ; 
  1780.         printint ( n ) ; 
  1781.         {
  1782.           helpptr = 3 ; 
  1783.           helpline [ 2 ] = 847 ; 
  1784.           helpline [ 1 ] = 848 ; 
  1785.           helpline [ 0 ] = 776 ; 
  1786.         } 
  1787.         error () ; 
  1788.       } 
  1789.     } 
  1790.     if ( mem [ r ] .hh.b0 == 1 ) 
  1791.     insertpenalties = insertpenalties + mem [ p + 1 ] .cint ; 
  1792.     else {
  1793.         
  1794.       mem [ r + 2 ] .hh .v.RH = p ; 
  1795.       delta = pagesofar [ 0 ] - pagesofar [ 1 ] - pagesofar [ 7 ] + 
  1796.       pagesofar [ 6 ] ; 
  1797.       if ( eqtb [ 5317 + n ] .cint == 1000 ) 
  1798.       h = mem [ p + 3 ] .cint ; 
  1799.       else h = xovern ( mem [ p + 3 ] .cint , 1000 ) * eqtb [ 5317 + n ] 
  1800.       .cint ; 
  1801.       if ( ( ( h <= 0 ) || ( h <= delta ) ) && ( mem [ p + 3 ] .cint + mem 
  1802.       [ r + 3 ] .cint <= eqtb [ 5721 + n ] .cint ) ) 
  1803.       {
  1804.         pagesofar [ 0 ] = pagesofar [ 0 ] - h ; 
  1805.         mem [ r + 3 ] .cint = mem [ r + 3 ] .cint + mem [ p + 3 ] .cint ; 
  1806.       } 
  1807.       else {
  1808.           
  1809.         if ( eqtb [ 5317 + n ] .cint <= 0 ) 
  1810.         w = 1073741823L ; 
  1811.         else {
  1812.         
  1813.           w = pagesofar [ 0 ] - pagesofar [ 1 ] - pagesofar [ 7 ] ; 
  1814.           if ( eqtb [ 5317 + n ] .cint != 1000 ) 
  1815.           w = xovern ( w , eqtb [ 5317 + n ] .cint ) * 1000 ; 
  1816.         } 
  1817.         if ( w > eqtb [ 5721 + n ] .cint - mem [ r + 3 ] .cint ) 
  1818.         w = eqtb [ 5721 + n ] .cint - mem [ r + 3 ] .cint ; 
  1819.         q = vertbreak ( mem [ p + 4 ] .hh .v.LH , w , mem [ p + 2 ] .cint 
  1820.         ) ; 
  1821.         mem [ r + 3 ] .cint = mem [ r + 3 ] .cint + bestheightplusdepth ; 
  1822.     ;
  1823. #ifdef STAT
  1824.         if ( eqtb [ 5300 ] .cint > 0 ) 
  1825.         {
  1826.           begindiagnostic () ; 
  1827.           printnl ( 849 ) ; 
  1828.           printint ( n ) ; 
  1829.           print ( 850 ) ; 
  1830.           printscaled ( w ) ; 
  1831.           printchar ( 44 ) ; 
  1832.           printscaled ( bestheightplusdepth ) ; 
  1833.           print ( 785 ) ; 
  1834.           if ( q == 0 ) 
  1835.           printint ( -10000 ) ; 
  1836.           else if ( mem [ q ] .hh.b0 == 12 ) 
  1837.           printint ( mem [ q + 1 ] .cint ) ; 
  1838.           else printchar ( 48 ) ; 
  1839.           enddiagnostic ( false ) ; 
  1840.         } 
  1841. #endif /* STAT */
  1842.         if ( eqtb [ 5317 + n ] .cint != 1000 ) 
  1843.         bestheightplusdepth = xovern ( bestheightplusdepth , 1000 ) * eqtb 
  1844.         [ 5317 + n ] .cint ; 
  1845.         pagesofar [ 0 ] = pagesofar [ 0 ] - bestheightplusdepth ; 
  1846.         mem [ r ] .hh.b0 = 1 ; 
  1847.         mem [ r + 1 ] .hh .v.RH = q ; 
  1848.         mem [ r + 1 ] .hh .v.LH = p ; 
  1849.         if ( q == 0 ) 
  1850.         insertpenalties = insertpenalties - 10000 ; 
  1851.         else if ( mem [ q ] .hh.b0 == 12 ) 
  1852.         insertpenalties = insertpenalties + mem [ q + 1 ] .cint ; 
  1853.       } 
  1854.     } 
  1855.     goto lab80 ; 
  1856.       } 
  1857.       break ; 
  1858.       default: 
  1859.       confusion ( 841 ) ; 
  1860.       break ; 
  1861.     } 
  1862.     if ( pi < 10000 ) 
  1863.     {
  1864.       if ( pagesofar [ 1 ] < pagesofar [ 0 ] ) 
  1865.       if ( ( pagesofar [ 3 ] != 0 ) || ( pagesofar [ 4 ] != 0 ) || ( pagesofar 
  1866.       [ 5 ] != 0 ) ) 
  1867.       b = 0 ; 
  1868.       else b = badness ( pagesofar [ 0 ] - pagesofar [ 1 ] , pagesofar [ 2 ] ) 
  1869.       ; 
  1870.       else if ( pagesofar [ 1 ] - pagesofar [ 0 ] > pagesofar [ 6 ] ) 
  1871.       b = 1073741823L ; 
  1872.       else b = badness ( pagesofar [ 1 ] - pagesofar [ 0 ] , pagesofar [ 6 ] ) 
  1873.       ; 
  1874.       if ( b < 1073741823L ) 
  1875.       if ( pi <= -10000 ) 
  1876.       c = pi ; 
  1877.       else if ( b < 10000 ) 
  1878.       c = b + pi + insertpenalties ; 
  1879.       else c = 100000L ; 
  1880.       else c = b ; 
  1881.       if ( insertpenalties >= 10000 ) 
  1882.       c = 1073741823L ; 
  1883.     ;
  1884. #ifdef STAT
  1885.       if ( eqtb [ 5300 ] .cint > 0 ) 
  1886.       {
  1887.     begindiagnostic () ; 
  1888.     printnl ( 37 ) ; 
  1889.     print ( 781 ) ; 
  1890.     printtotals () ; 
  1891.     print ( 844 ) ; 
  1892.     printscaled ( pagesofar [ 0 ] ) ; 
  1893.     print ( 784 ) ; 
  1894.     if ( b == 1073741823L ) 
  1895.     printchar ( 42 ) ; 
  1896.     else printint ( b ) ; 
  1897.     print ( 785 ) ; 
  1898.     printint ( pi ) ; 
  1899.     print ( 845 ) ; 
  1900.     if ( c == 1073741823L ) 
  1901.     printchar ( 42 ) ; 
  1902.     else printint ( c ) ; 
  1903.     if ( c <= leastpagecost ) 
  1904.     printchar ( 35 ) ; 
  1905.     enddiagnostic ( false ) ; 
  1906.       } 
  1907. #endif /* STAT */
  1908.       if ( c <= leastpagecost ) 
  1909.       {
  1910.     bestpagebreak = p ; 
  1911.     bestsize = pagesofar [ 0 ] ; 
  1912.     leastpagecost = c ; 
  1913.     r = mem [ memtop ] .hh .v.RH ; 
  1914.     while ( r != memtop ) {
  1915.         
  1916.       mem [ r + 2 ] .hh .v.LH = mem [ r + 2 ] .hh .v.RH ; 
  1917.       r = mem [ r ] .hh .v.RH ; 
  1918.     } 
  1919.       } 
  1920.       if ( ( c == 1073741823L ) || ( pi <= -10000 ) ) 
  1921.       {
  1922.     fireup ( p ) ; 
  1923.     if ( outputactive ) 
  1924.     return ; 
  1925.     goto lab30 ; 
  1926.       } 
  1927.     } 
  1928.     if ( ( mem [ p ] .hh.b0 < 10 ) || ( mem [ p ] .hh.b0 > 11 ) ) 
  1929.     goto lab80 ; 
  1930.     lab90: if ( mem [ p ] .hh.b0 == 11 ) 
  1931.     q = p ; 
  1932.     else {
  1933.     
  1934.       q = mem [ p + 1 ] .hh .v.LH ; 
  1935.       pagesofar [ 2 + mem [ q ] .hh.b0 ] = pagesofar [ 2 + mem [ q ] .hh.b0 ] 
  1936.       + mem [ q + 2 ] .cint ; 
  1937.       pagesofar [ 6 ] = pagesofar [ 6 ] + mem [ q + 3 ] .cint ; 
  1938.       if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) ) 
  1939.       {
  1940.     {
  1941.       if ( interaction == 3 ) 
  1942.       wakeupterminal () ; 
  1943.       printnl ( 133 ) ; 
  1944.       print ( 842 ) ; 
  1945.     } 
  1946.     {
  1947.       helpptr = 4 ; 
  1948.       helpline [ 3 ] = 843 ; 
  1949.       helpline [ 2 ] = 811 ; 
  1950.       helpline [ 1 ] = 812 ; 
  1951.       helpline [ 0 ] = 776 ; 
  1952.     } 
  1953.     error () ; 
  1954.     r = newspec ( q ) ; 
  1955.     mem [ r ] .hh.b1 = 0 ; 
  1956.     deleteglueref ( q ) ; 
  1957.     mem [ p + 1 ] .hh .v.LH = r ; 
  1958.       } 
  1959.     } 
  1960.     pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] + mem [ q + 1 ] .cint 
  1961.     ; 
  1962.     pagesofar [ 7 ] = 0 ; 
  1963.     lab80: if ( pagesofar [ 7 ] > pagemaxdepth ) 
  1964.     {
  1965.       pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] - pagemaxdepth ; 
  1966.       pagesofar [ 7 ] = pagemaxdepth ; 
  1967.     } 
  1968.     mem [ pagetail ] .hh .v.RH = p ; 
  1969.     pagetail = p ; 
  1970.     mem [ memtop - 1 ] .hh .v.RH = mem [ p ] .hh .v.RH ; 
  1971.     mem [ p ] .hh .v.RH = 0 ; 
  1972.     goto lab30 ; 
  1973.     lab31: mem [ memtop - 1 ] .hh .v.RH = mem [ p ] .hh .v.RH ; 
  1974.     mem [ p ] .hh .v.RH = 0 ; 
  1975.     flushnodelist ( p ) ; 
  1976.     lab30: ; 
  1977.   } while ( ! ( mem [ memtop - 1 ] .hh .v.RH == 0 ) ) ; 
  1978.   if ( nestptr == 0 ) 
  1979.   curlist .tailfield = memtop - 1 ; 
  1980.   else nest [ 0 ] .tailfield = memtop - 1 ; 
  1981. appspace () {
  1982.     appspace_regmem 
  1983.   halfword p  ; 
  1984.   halfword q  ; 
  1985.   internalfontnumber f  ; 
  1986.   integer k  ; 
  1987.   if ( ( curlist .auxfield >= 2000 ) && ( eqtb [ 3539 ] .hh .v.RH != 0 ) ) 
  1988.   q = newparamglue ( 13 ) ; 
  1989.   else {
  1990.       
  1991.     if ( eqtb [ 3538 ] .hh .v.RH != 0 ) 
  1992.     p = eqtb [ 3538 ] .hh .v.RH ; 
  1993.     else {
  1994.     
  1995.       p = fontglue [ eqtb [ 4578 ] .hh .v.RH ] ; 
  1996.       if ( p == 0 ) 
  1997.       {
  1998.     f = eqtb [ 4578 ] .hh .v.RH ; 
  1999.     p = newspec ( 0 ) ; 
  2000.     k = parambase [ f ] + 2 ; 
  2001.     mem [ p + 1 ] .cint = fontinfo [ k ] .cint ; 
  2002.     mem [ p + 2 ] .cint = fontinfo [ k + 1 ] .cint ; 
  2003.     mem [ p + 3 ] .cint = fontinfo [ k + 2 ] .cint ; 
  2004.     fontglue [ f ] = p ; 
  2005.       } 
  2006.     } 
  2007.     p = newspec ( p ) ; 
  2008.     if ( curlist .auxfield >= 2000 ) 
  2009.     mem [ p + 1 ] .cint = mem [ p + 1 ] .cint + fontinfo [ 7 + parambase [ 
  2010.     eqtb [ 4578 ] .hh .v.RH ] ] .cint ; 
  2011.     mem [ p + 2 ] .cint = xnoverd ( mem [ p + 2 ] .cint , curlist .auxfield , 
  2012.     1000 ) ; 
  2013.     mem [ p + 3 ] .cint = xnoverd ( mem [ p + 3 ] .cint , 1000 , curlist 
  2014.     .auxfield ) ; 
  2015.     q = newglue ( p ) ; 
  2016.     mem [ p ] .hh .v.RH = 0 ; 
  2017.   } 
  2018.   mem [ curlist .tailfield ] .hh .v.RH = q ; 
  2019.   curlist .tailfield = q ; 
  2020.